package models;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import org.hibernate.annotations.Entity;
import daos.*;

public class Sistema {

	private Casilla casillaActual;
	private List<Oficina> oficinas;
	private List<RelacionConfianza> relaciones;
	private static Sistema instancia;
	private Dao_Oficinas dao= Dao_Oficinas.getInstancia();
	
	public static Sistema getInstancia() {
		if(instancia==null)
		{
			instancia=new Sistema();
		}
		return instancia;
	}

	private Sistema(){
		oficinas=new ArrayList<Oficina>();
		relaciones=new ArrayList<RelacionConfianza>();
	}

	//ABM Oficinas de correo
	public void crearOficinaDeCorreo(String nombre){
		Oficina nueva= new Oficina(nombre);
		oficinas.add(nueva);
		dao.agregarOficinaAguardar(nueva);
		System.out.println(nueva.getNombre());
	}
	public void bajaOficinaDeCorreo(String nombre){
		for(Oficina oficina : oficinas)
		{
			if (oficina.getNombre().equalsIgnoreCase(nombre)){
				oficinas.remove(oficina);
				dao.agregarOficinaAeliminar(oficina);
				break;
			}
		}
	}
	//ABM Casillas de correo
	public boolean crearCasillaDeCorreo(String address, String nombre, String apellido, String password, String nombreOficina)
	{
		boolean validar = false;
		for(Oficina oficina : oficinas)
		{
			if (oficina.getNombre().equalsIgnoreCase(nombreOficina)){
				oficina.crearCasillaDeCorreo(address, nombre, apellido, password);
				validar = true;
			}
		}
		return validar;
	}
		
		
	
	public void bajaCasillaDeCorreo(String address, String nombreOficina){
		for(Oficina oficina : oficinas)
		{
			if (oficina.getNombre().equalsIgnoreCase(nombreOficina)){
				oficina.bajaCasillaDeCorreo(address);
				break;
			}
		}
	}
	
	
	
	//ABM Relaciones de confianza
	public boolean crearRelacionDeConfianza(String nombreOficinaA, String nombreOficinaB){
		boolean ok=true;
		Oficina oficinaA=null, oficinaB=null;
		for(Oficina oficina : oficinas)
		{
			if (oficina.getNombre().equalsIgnoreCase(nombreOficinaA)){
				oficinaA= oficina;
			}else if(oficina.getNombre().equalsIgnoreCase(nombreOficinaB)){
				oficinaB=oficina;
			}
		}
		if(oficinaA != null && oficinaB != null){
			RelacionConfianza nueva= new RelacionConfianza(oficinaA, oficinaB);
			relaciones.add(nueva);
			dao.agregarRelacionAguardar(nueva);
			
		}else{
			ok=false;
		}
		return ok;
	}
	public boolean bajaRelacionDeConfianza(String nombreOficinaA, String nombreOficinaB){
		boolean ok=true;
		Oficina oficinaA=null, oficinaB=null;
		for(Oficina oficina : oficinas)
		{
			if (oficina.getNombre().equalsIgnoreCase(nombreOficinaA)){
				oficinaA= oficina;
			}else if(oficina.getNombre().equalsIgnoreCase(nombreOficinaB)){
				oficinaB=oficina;
			}
		}
		if(oficinaA != null && oficinaB != null){
			for(RelacionConfianza relacion : relaciones){
				if(relacion.getOficina_a()==oficinaA && relacion.getOficina_b()==relacion.getOficina_b())
				{
					relaciones.remove(relacion);
					dao.agregarRelacionAeliminar(relacion);
					break;
				}
			}
			
		}else{
			ok=false;
		}
		return ok;
	}

	public List<Oficina> getOficinas() {
		return oficinas;
	}
	
	public boolean validarNombreOficina(String nombre){
		boolean ok=true;
		for(Oficina oficina : oficinas){
			
			if (oficina.getNombre().equalsIgnoreCase(nombre)){
				ok=false;
			}
		}
		return ok;
	}

	public boolean validarCasilla(String address, String nombreOficina) {
		boolean ok=false;
		for(Oficina oficina : oficinas)
		{
			if (oficina.getNombre().equalsIgnoreCase(nombreOficina)){
				ok=oficina.validarCasillaDeCorreo(address);
				break;
			}
		}
		return ok;
	}

	public List<RelacionConfianza> getRelaciones() {
		return relaciones;
	}

	public void setOficinas(List<Oficina> oficinas) {
		this.oficinas = oficinas;
	}
	
}